package com.cuijq.datasource;

import lombok.Data;

public class LinkStringDemo {

  public static void main(String[] args) {
    LinkStringDemo linkDemo = new LinkStringDemo();
    SingleChain singleChain= linkDemo.new SingleChain(5);
    singleChain.printChain(singleChain.getHead());
  }
  //1.理解指针与引用    存储内存对象的地址  将某个变量赋值给指针，将存储变量的地址赋值给指针，
  //指针中存储了这个变量的内存地址
  //  p->next=q。这行代码是说，p 结点中的 next 指针存储了 q 结点的内存地址
  //  p->next=p->next->next。这行代码表示，p 结点的 next 指针存储了 p 结点的下下一个结点的内存地址
  //2. 警惕指针丢失和内存泄漏 ,插入结点时，一定要注意操作的顺序
  //3. 利用哨兵简化实现难度

  //链表的检验，边界条件。
//    如果链表为空时，代码是否能正常工作？
//    如果链表只包含一个结点时，代码是否能正常工作？
//    如果链表只包含两个结点时，代码是否能正常工作？
//    代码逻辑在处理头结点和尾结点的时候，是否能正常工作？

  //1.单链表反转

  //2.链表中环的检测
  //3.两个有序的链表合并
  //4.删除链表倒数第 n 个结点
  //5.求链表的中间结点


  class SingleChain {

    private Node head;

    public SingleChain(int size) {
      Node head = new Node(0);
      Node cur = head;
      for (int i = 1; i < size; i++) {
        Node tmp = new Node(i);
        cur.setNext(tmp);
        cur = tmp;
      }
      this.head = head;
    }

    public Node getHead() {
      return head;
    }

    public void setHead(Node head) {
      this.head = head;
    }

    public void printChain(Node head) {
      StringBuilder sb = new StringBuilder();
      Node cur = head;
      sb.append(cur.getData());
      while (null != cur.getNext()) {
        sb.append(" -> ");
        sb.append(cur.getNext().getData());
        cur = cur.getNext();
      }
      System.out.println(sb.toString());
    }
  }

  @Data
  class Node {

    private int data;// 数据域
    private String dataStr;
    private Node next;// 指针域

    public Node(int data) {
      this.data = data;
    }
  }
}
